package com.aviator.executor;

import com.googlecode.aviator.AviatorEvaluator;

import java.util.*;

/**
 * @Author: Jiangxx
 * @Date: 2021/12/30
 * @Description: 访问数组和集合、三元操作符、正则表达式匹配
 */
public class AviatorExecutor08 {

    public static void main(String[] args) {
        /**
         * 访问数组和集合
         */
        List<String> list = new ArrayList<String>();
        list.add("hello");
        list.add(" world");
        final int[] array = new int[3];
        array[0] = 0;
        array[1] = 1;
        array[2] = 3;
        final Map<String, Date> map = new HashMap<String, Date>();
        map.put("date", new Date());
        Map<String, Object> env = new HashMap<String, Object>();
        env.put("list", list);
        env.put("array", array);
        env.put("mmap", map);
        System.out.println(AviatorEvaluator.execute("list[0]+list[1]", env));   // hello world
        System.out.println(AviatorEvaluator.execute("'array[0]+array[1]+array[2]=' + (array[0]+array[1]+array[2])", env));  // array[0]+array[1]+array[2]=4
        System.out.println(AviatorEvaluator.execute("'today is ' + mmap.date ", env));  // today is Wed Feb 24 17:31:45 CST 2016

        /* 如果函数调用或者括号表达式结果是一个数组或者List，你同样可以可以通过 [index] 访问 */
        System.out.println(AviatorEvaluator.exec("string.split(s,',')[0]", "a,b,c,d"));//a

        /**
         * 三元操作符：Aviator 不提供if else语句, 但是提供了三元操作符?:用于条件判断,使用上与 java 没有什么不同
         */
        System.out.println(AviatorEvaluator.exec("a>0? 'yes':'no'", 1));//yes

        /**
         * 正则表达式匹配:Aviator 在表达式级别支持正则表达式,通过//括起来的字符序列构成一个正则表达式,
         * 正则表达式可以用于匹配(作为=~的右操作数)、比较大小。但是匹配仅能与字符串进行匹配。匹配成功后,
         * Aviator 会自动将匹配成功的捕获分组(capturing groups) 放入 env ${num}的变量中,
         * 其中$0 指代整个匹配的字符串,而$1表示第一个分组，$2表示第二个分组以此类推。
         *
         * 请注意，分组捕获放入 env 是默认开启的，因此如果传入的 env 不是线程安全并且被并发使用，可能存在线程安全的隐患。
         * 关闭分组匹配，可以通过 AviatorEvaluator.setOption(Options.PUT_CAPTURING_GROUPS_INTO_ENV, false); 来关闭，
         * 对性能有稍许好处。
         *
         * Aviator 的正则表达式规则跟 Java 完全一样,因为内部其实就是使用java.util.regex.Pattern做编译的。
         */
        String email = "killme2008@gmail.com";
        Map<String, Object> env1 = new HashMap<String, Object>();
        env1.put("email", email);
        String username = (String) AviatorEvaluator.execute("email=~/([\\w0-8]+)@\\w+[\\.\\w+]+/ ? $1 : 'unknow' ", env1);
        System.out.println(username); // killme2008
    }
}
